home *** CD-ROM | disk | FTP | other *** search
/ Your Choice 3 / Your Choice Software Collection 3.iso / prgmming / fsprite3 / realevil.pas < prev    next >
Pascal/Delphi Source File  |  1994-04-27  |  8KB  |  241 lines

  1. unit realevil;
  2. {Reality}
  3. {by Warren Steven Riley}
  4. {Copyright 1992,1994}
  5. {All Rights Reserved}
  6. interface
  7.  
  8. PROCEDURE MEANBOMBS;
  9. procedure ENEMY_EYEBALL_HIT(MISSILENUM:BYTE;MH:WORD); {When Enemy EYEBALLs HIT Do this}
  10. procedure SHAPEMONSTER_HIT(MISSILENUM:BYTE;MH:WORD);    {When enemy HIT do this}
  11. procedure DEATHME;
  12. PROCEDURE sounder (NOTE : WORD); {Play a sound under right conditions}
  13. PROCEDURE play (a, b : WORD);   {Play note with duration}
  14. procedure get_bonus_ship;       {Get an extra fighter}
  15. PROCEDURE Victory;              {Play victory song!}
  16. PROCEDURE BONUS(A:WORD);   {Bonus situation}
  17. PROCEDURE Scoreme;
  18. PROCEDURE Upscore (X : WORD);
  19.  
  20. implementation
  21. uses realbomb,realvars,crt,dos,FSPRITE3;
  22.  
  23. PROCEDURE MEANBOMBS;           {Procedure controls evil bombs}
  24. VAR Dropby:INTEGER;             {DROP:Mean Bomb is dropped by}
  25.     DROP_CHANCE:BYTE;             {Chance of enemy dropping meanbomb}
  26. BEGIN
  27.   {drop:chance drop and find a spare bullet sprite}
  28.  IF level < 6 THEN DROP_CHANCE := 40 ELSE DROP_CHANCE := 15;
  29.   IF RANDOM(DROP_CHANCE) = 1 THEN
  30.      IF NOT ((SHAPE_MODE=snake) AND DIEOUT) THEN  {If mode isn't snake or it's not dead}
  31.         BEGIN
  32.          setfire := - 1;
  33.          dropby := - 1;
  34.          FOR i := 0 TO MAX_ENEMY_FIRE-1 DO
  35.             IF NOT (ONSCREEN [ENEMYFIRE_OS + i] .ON) THEN
  36.                setfire := i + ENEMYFIRE_OS;
  37.          IF setfire <> - 1 THEN {Drop:pick ENEMYFIRE_OS dropper}
  38.            BEGIN
  39.              IF SHAPE_MODE <> snake THEN    {If mode is shape}
  40.                j := RANDOM (LASTSHAPE_OS)  {Random shape is picked to drop missile}
  41.                  ELSE j:=0;                {If it is snake drop from tale}
  42.              FOR i := j TO LASTSHAPE_OS DO
  43.                IF ONSCREEN [i] .ON THEN dropby := i;
  44.              FOR i := 0 TO j DO
  45.                IF ONSCREEN [i] .ON THEN dropby := i;
  46.            END;
  47.         {Drop:Setup drop sequence}
  48.         IF dropby <> - 1 THEN
  49.            BEGIN
  50.              ONSCREEN[setfire].ON:=TRUE;
  51.              ONSCREEN[setfire].X:=ONSCREEN[dropby].X+7;
  52.              ONSCREEN[setfire].Y:=ONSCREEN[dropby].Y+6;
  53.            END;
  54.         END;
  55.   {Drop:Move dropped sprites and see if it HIT fighter}
  56.   FOR i := 0 TO MAX_ENEMY_FIRE-1 DO
  57.       IF ONSCREEN [ENEMYFIRE_OS + i] .ON THEN
  58.          BEGIN
  59.          INC (ONSCREEN [ENEMYFIRE_OS + i] .Y, dropspeed);
  60.          IF ENEMY_FIRE_SEEK  THEN
  61.             IF ONSCREEN [ENEMYFIRE_OS + i] .X < (ManX+7)
  62.                THEN INC (ONSCREEN [ENEMYFIRE_OS + i] .X, 1)
  63.                  ELSE DEC (ONSCREEN [ENEMYFIRE_OS + i] .X, 1);
  64.          IF ONSCREEN [ENEMYFIRE_OS + i] .Y > 186 THEN
  65.             ONSCREEN [ENEMYFIRE_OS + i] .ON := FALSE;
  66.          IF NOT (DEMO_MODE) THEN
  67.             IF ONSCREEN [ENEMYFIRE_OS + i] .Y > 184 THEN
  68.                IF ONSCREEN [ENEMYFIRE_OS + i] .X > ManX + 2 THEN
  69.                   IF ONSCREEN [ENEMYFIRE_OS + i] .X < ManX + 17 THEN DEATHME;
  70.          END;
  71. END;
  72.  
  73. procedure ENEMY_EYEBALL_HIT(MISSILENUM:BYTE;MH:WORD); {When Enemy EYEBALLs HIT Do this}
  74. BEGIN
  75.   IF MISSILENUM<2 THEN ONSCREEN [MYFIRE1_OS+MISSILENUM] .ON := FALSE; {Turn fighter's missile off}
  76.   ONSCREEN [MH] .NUM := boom1;
  77.   explosion_noise := TRUE;
  78.   EN := 0;
  79.   INC (death_count);
  80.   shape_dead [MH] := TRUE;
  81.   Upscore (250);
  82.   Scoreme;
  83. eND;
  84.  
  85. procedure SHAPEMONSTER_HIT(MISSILENUM:BYTE;MH:WORD);    {When enemy HIT do this}
  86. begin
  87.  IF MISSILENUM<2 THEN ONSCREEN [MYFIRE1_OS+MISSILENUM] .ON := FALSE; {Turn fighter's missile off}
  88.  IF SHAPE_MODE = snake THEN
  89.     IF NOT (dIEOUT) THEN
  90.        IF (MH = LASTSHAPE_OS) OR (MH = LASTSHAPE_OS - 1) THEN
  91.           BEGIN
  92.           Upscore (200);
  93.           Scoreme;
  94.           explosion_noise := TRUE;
  95.           EN := 0;
  96.           INC (SNAKE_COUNT);
  97.           IF SNAKE_COUNT = LASTSHAPE_OS THEN
  98.              BEGIN
  99.              dIEOUT := TRUE;
  100.              DEC (SNAKE_COUNT);
  101.              END;
  102.           END;
  103.  IF SHAPE_MODE <> snake THEN
  104.     BEGIN
  105.      ONSCREEN [MH] .NUM := boom1;
  106.      explosion_noise := TRUE;
  107.      EN := 0;
  108.      IF SHAPE_MODE <> LEADER THEN
  109.        BEGIN
  110.         INC (death_count);
  111.         shape_dead [MH] := TRUE;
  112.         Upscore (175);
  113.         Scoreme;
  114.        END
  115.     ELSE
  116.        {SHAPE_MODE = EYEBALL}
  117.        IF leada [MH] <> 0 THEN
  118.           BEGIN
  119.           leada [MH] := 0;
  120.           Upscore (125);
  121.           Scoreme;
  122.           END
  123.        ELSE
  124.           BEGIN
  125.             INC (death_count);
  126.             shape_dead [MH] := TRUE;
  127.             Upscore (175);
  128.             Scoreme;
  129.           END;
  130.     END;
  131. end;
  132.  
  133. PROCEDURE DEATHME;      {Routine to handle your death}
  134. var D:word;
  135. BEGIN
  136.   FOR i:=0 TO MAX_ENEMY_FIRE-1 DO       {Turn most sprites off}
  137.       ONSCREEN[ENEMYFIRE_OS+i].ON:=FALSE;
  138.   DEC(numlives);
  139.   SHOW;
  140.   FOR D := 1 TO 6 DO
  141.       BEGIN
  142.         IF D<4 THEN      {Change fighter sprite for explosion effect}
  143.            ONSCREEN[MYFIGHTER_OS].NUM :=LIVES+D;
  144.         IF D=4 THEN      {Turn fighter off}
  145.            ONSCREEN[MYFIGHTER_OS].ON:=FALSE;
  146.         IF BOMBER_ON THEN IF BOMBER_MODE=19 THEN
  147.            LASER_BEAMS;  {Continue showing laser beams if they were active}
  148.         SHOW;
  149.         FOR j := 1 TO 10 DO       {Make explosion noise}
  150.            FOR i := 1 TO 7 DO
  151.               BEGIN
  152.                DELAY(1);
  153.                SOUND(i*30+200+j*10+RANDOM(200)-D*39);
  154.                DELAY(1);
  155.                SOUND(i);
  156.               END;
  157.       END;
  158.   ONSCREEN [MYFIGHTER_OS].ON:=TRUE;            {Turn your fighter back on}
  159.   ONSCREEN [MYFIGHTER_OS].NUM:=fighter;        {Make it normal fighter sprite}
  160.   IF numlives=0 THEN             {If lives=0 then game is over}
  161.      BEGIN
  162.        act:=back^;
  163.        GOTOXY(17, 11);
  164.        WRITELN('GAME OVER');
  165.        back^ := act;
  166.        DEMO_MODE := TRUE;
  167.        ONSCREEN[MYFIGHTER_OS].ON:=FALSE;
  168.      END;
  169.   act:=back^;
  170.   Scoreme;                {Update screen score}
  171.   ManX:=140;              {Place your fighter in middle of screen}
  172.   ONSCREEN[MYFIRE1_OS] .ON := FALSE;
  173.   ONSCREEN[MYFIRE2_OS] .ON := FALSE;
  174.   FOR i := 0 TO MAX_ENEMY_FIRE-1 DO
  175.       ONSCREEN [ENEMYFIRE_OS + i] .ON := FALSE;
  176.   Fireaway := FALSE;
  177.   Bomber_act := FALSE;
  178.   NOSOUND;
  179.   IF BOMBER_MODE =19 THEN BOMBER_MODE:=20;
  180. END;
  181.  
  182. PROCEDURE Sounder (NOTE : WORD); {Play a sound under right conditions}
  183. BEGIN
  184.   IF NOT(DEMO_MODE) THEN        {Demo mode has no sound}
  185.      IF xkey(CAPSLOCK) THEN        {When capslock is selected - no sound}
  186.         SOUND(NOTE);
  187. END;
  188.  
  189. PROCEDURE play (a, b : WORD);   {Play note with duration}
  190. BEGIN;
  191.   sounder (a);
  192.   DELAY (b);
  193.   NOSOUND;
  194.   DELAY (10);
  195. END;
  196.  
  197. procedure Get_Bonus_Ship;   {Get an extra fighter}
  198. BEGIN
  199.      SCORE_LIFE_BONUS:=TRUE; {Only allow one extra ship for score above 20000}
  200.      INC (numlives);
  201.      play (1174, 200);
  202.      play (880, 100);
  203.      play (740, 50);
  204.      play (880, 200);
  205.      SCOREME;
  206. END;
  207.  
  208. PROCEDURE Victory;          {Play victory song!}
  209. BEGIN
  210.   play (880, 300);
  211.   play (740, 100);
  212.   play (880, 200);
  213.   play (1174, 400);
  214. END;
  215.  
  216. PROCEDURE BONUS(A:WORD);   {Bonus situation}
  217. BEGIN
  218.   act:=back^;
  219.   NOSOUND;
  220.   textattr := 64 + wHITe;
  221.   GOTOXY (14, 11);
  222.   WRITELN ('BONUS: ',a*(level DIV 5+1) DIV 10:6);
  223.   DELAY (800);
  224.   INC(SCORE,a*(level DIV 5+1));
  225. END;
  226.  
  227. PROCEDURE Scoreme;  {Show current score and number of remaining lives}
  228. BEGIN
  229.   GOTOXY(4,1);
  230.   WRITELN(NUMLIVES:1);
  231.   GOTOXY(34,1);
  232.   WRITELN((SCORE DIV 10):7);
  233. END;
  234.  
  235. PROCEDURE Upscore(X:WORD);
  236. BEGIN
  237.   INC (SCORE, X * (level + 5) );
  238. END;
  239.  
  240. begin
  241. end.